package com.dev.jwt.utils;

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONObject;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
 
import java.util.Date;
 

/**
 * Token工具类，用于生成和验证JWT令牌。
 */
public class TokenUtil {

    /**
     * JWT加密的密钥。
     */
    private final static String ENCRYPT_KEY = "abc123";

    /**
     * JWT令牌的过期时间，单位为分钟。
     */
    private final static int EXPIRE_TIME = 1;

    /**
     * JWT令牌的发行者。
     */
    private static final String ISSUER = "zhangsan";

    /**
     * 生成JWT令牌。
     *
     * @param json 令牌中承载的信息，以JSONObject形式提供。
     * @return 生成的JWT令牌字符串。
     */
    public static String createToken(JSONObject json) {
        // 使用JWT创建一个令牌
        return JWT.create()
                // 设置令牌的主题，即json对象转换后的字符串 不要把密码封装进去，不安全
                .withSubject(json.toString())
                // 设置令牌的发行者
                .withIssuer(ISSUER)
                // 设置令牌的过期时间，以当前时间为基础加上设定的过期时间
                .withExpiresAt(DateUtil.offsetMinute(new Date(), EXPIRE_TIME))
                // 设置自定义的声明，这里以"test"为键，"123"为值
                .withClaim("test", "123")
                // 使用HMAC256算法对令牌进行签名加密
                .sign(Algorithm.HMAC256(ENCRYPT_KEY));
    }

    /**
     * 验证JWT令牌的有效性。
     *
     * @param token 待验证的JWT令牌字符串。
     * @return 如果令牌有效，则返回true；否则返回false。
     */
    public static boolean verifyToken(String token) {
        try {
            // 创建一个 JWT 验证器，使用 HMAC256 算法，密钥为 ENCRYPT_KEY，发行者为 ISSUER
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(ENCRYPT_KEY))
                    .withIssuer(ISSUER)
                    .build();

            // 对令牌进行验证
            jwtVerifier.verify(token);
            // 如果验证成功，返回 true
            return true;
        } catch (Exception e) {
            // 验证失败，打印异常信息，并返回false
            e.printStackTrace();
            return false;
        }
    }
}